#include "roundaboutPages.h"
#include "types.h"
#include <QGroupBox>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QLabel>
#include <QSlider>
#include <QSpinBox>
#include <QTextCodec>
#include <QCheckBox>
#include <QComboBox>
#include <QDebug>
#include <QSpacerItem>
#include <QSettings>


/*!
  Konstruktor tworzy widgety należące do tej klasy, dodaje je do layoutu _topLayout, a ten do _mainLayout.
  Tworzone są connecty - sprzężenia pomiędzy odpowiadającymi sobie QSliderami i QSpinBoxami.
  Na koniec wywoływana jest funkcja configureRoundaboutPage().
  */
RoundaboutPage::RoundaboutPage(QWidget *parent)
     : QWidget(parent)
 {
    QTextCodec::setCodecForTr (QTextCodec::codecForName("UTF-8"));

    _promienRondaLabel = new QLabel(tr("Promień Ronda:"));
    _promienRondaSlider = new QSlider(Qt::Horizontal);
    _promienRondaSpinBox = new QSpinBox();
    connect(_promienRondaSlider, SIGNAL(valueChanged(int)), _promienRondaSpinBox, SLOT(setValue(int)));
    connect(_promienRondaSpinBox, SIGNAL(valueChanged(int)), _promienRondaSlider, SLOT(setValue(int)));

    _lPasowRondoLabel = new QLabel(tr("Liczba pasów na rondzie:"));
    _lPasowRondoSlider = new QSlider(Qt::Horizontal);
    _lPasowRondoSpinBox = new QSpinBox();
    connect(_lPasowRondoSlider, SIGNAL(valueChanged(int)), _lPasowRondoSpinBox, SLOT(setValue(int)));
    connect(_lPasowRondoSpinBox, SIGNAL(valueChanged(int)), _lPasowRondoSlider, SLOT(setValue(int)));

    _szerokoscUlicyLabel = new QLabel(tr("Szerokość ulicy:"));
    _szerokoscUlicySlider = new QSlider(Qt::Horizontal);
    _szerokoscUlicySpinBox = new QSpinBox();
    connect(_szerokoscUlicySlider, SIGNAL(valueChanged(int)), _szerokoscUlicySpinBox, SLOT(setValue(int)));
    connect(_szerokoscUlicySpinBox, SIGNAL(valueChanged(int)), _szerokoscUlicySlider, SLOT(setValue(int)));

    _rysujBarieryCheckBox = new QCheckBox(tr("Rysuj bariery"));

     _topLayout = new QGridLayout();
     _topLayout->addWidget(_promienRondaLabel, 0, 0);
     _topLayout->addWidget(_promienRondaSlider, 0, 1);
     _topLayout->addWidget(_promienRondaSpinBox, 0, 2);
     _topLayout->addWidget(_lPasowRondoLabel, 1, 0);
     _topLayout->addWidget(_lPasowRondoSlider, 1, 1);
     _topLayout->addWidget(_lPasowRondoSpinBox, 1, 2);
     _topLayout->addWidget(_szerokoscUlicyLabel, 2, 0);
     _topLayout->addWidget(_szerokoscUlicySlider, 2, 1);
     _topLayout->addWidget(_szerokoscUlicySpinBox, 2, 2);
     _topLayout->addWidget(_rysujBarieryCheckBox, 3, 0);

     _mainLayout = new QVBoxLayout();
     _mainLayout->addLayout(_topLayout);
     _mainLayout->setAlignment(_topLayout, Qt::AlignTop);

     setLayout(_mainLayout);
     configureRoundaboutPage();
 }

/*!
  Funkcja konfiguruje utworzone widgety ustawiając wartosci domyślne.
Tworzy connect pomiędzy _lPasowRondoSpinBox a sygnałem changeNumLane.
  */
void RoundaboutPage::configureRoundaboutPage()
{
    connect(_lPasowRondoSpinBox, SIGNAL(valueChanged(int)), this, SIGNAL(changeNumLane(int)));
    _szerokoscUlicySlider->setValue(30);
    _promienRondaSpinBox->setRange(50,500);
    _promienRondaSlider->setRange(50,500);
    _promienRondaSpinBox->setValue(200);

    _lPasowRondoSpinBox->setRange(1,5);
    _lPasowRondoSlider->setRange(1,5);
    _lPasowRondoSpinBox->setValue(3);

    _szerokoscUlicySpinBox->setRange(10,100);
    _szerokoscUlicySlider->setRange(10,100);
    _szerokoscUlicySpinBox->setValue(30);
}


/*!
  Funkcja odczytuje wartości zapisane za pomocą QSettings (patrz: \link stronaZapisOpcji Opcje \endlink)
  i przypisuje je do odpowiednich zmiennych. W przypadku braku zapisanych opcji przypisuje wartości domyślne.
  */
void RoundaboutPage::readRoundaboutSettings()
{
    QSettings o("TabMar", "RoundaboutSimulator");

    int x = o.value("radius", 200).toInt() ;
    _promienRondaSpinBox->setValue( x );

     x = o.value("rimNumLanes", 3).toInt();
    _lPasowRondoSpinBox->setValue(x);

     x = o.value("laneWidth", 30).toInt() ;
    _szerokoscUlicySpinBox->setValue(x);

     x = o.value("drawBarriers", 0).toInt();
    _rysujBarieryCheckBox->setCheckState( Qt::CheckState(x) );
}

/*!
  Zwraca promień ronda ze zmiennej _promienRondaSpinBox.
  */
int RoundaboutPage::getRadius()
{ return (_promienRondaSpinBox->value()); }

/*!
  Zwraca liczbę pasów na rondzie ze zmiennej _lPasowRondoSpinBox.
  */
int RoundaboutPage::getRimNumLanes()
{ return (_lPasowRondoSpinBox->value()); }

/*!
  Zwraca szerokość ulicy ze zmiennej _szerokoscUlicySpinBox.
  */
int RoundaboutPage::getWidthLane()
{ return (_szerokoscUlicySpinBox->value()); }

/*!
  Zwraca stn QCheckBoxa ze zmiennej _rysujBarieryCheckBox.
  Jeżeli QCheckBox jest zaznaczony funkcja zwraca wartość 2, w przeciwnym razie 0.
Patrz:  <a href=" http://doc.qt.nokia.com/latest/qt.html#CheckState-enum">dokumentacja Qt</a>.
  */
int RoundaboutPage::drawBarriers()
{ return (_rysujBarieryCheckBox->checkState()); }

/*!
  Zwraca liczbę pasów na rondzie ze zmiennej _lPasowRondoSlider.
  */
int RoundaboutPage::getNumLanesOnBranch()
{ return _lPasowRondoSlider->value(); }
